#ifndef __SCRIPT_BLOCK_H__
#define __SCRIPT_BLOCK_H__

#include "script_expression.h"

struct script_t;

typedef enum{
	SCRIPT_BLOCK_TYPE_NONE,
	SCRIPT_BLOCK_TYPE_FUNC,
	SCRIPT_BLOCK_TYPE_LOOP,
}script_block_type_e;

typedef struct script_exp{
	int			line;
	exp_node_t	*exp;
}script_exp_t;

typedef struct script_code_block_t{

	// 代码块类型， 主要用于判定return 和 break语句的退出
	script_block_type_e type;

	struct script_t *script;		// 所属的脚本

	// 表达式列表
	TFly_list_t		*exp_list;

	// 变量列表	
	exp_var_t		*vars;

}script_code_block_t;

typedef struct script_exec_block{
	// 代码块类型， 主要用于判定return 和 break语句的退出
	script_block_type_e type;

	struct script_t		*script;				// 所属的脚本

	TFly_list_item_t	*item;	// 当前执行的表达式

	// 变量列表	
	exp_var_t *vars;

}script_exec_block_t;

/********************************************************
 *	function	script_exp_create
 *		创建执行单元
 *
 * ******************************************************/
script_exp_t *script_exp_create(int line,exp_node_t *node);

/********************************************************
 *	function	script_exp_desctroy
 *		销毁执行单元
 *
 * ******************************************************/
void script_exp_destroy(script_exp_t *exp);

/********************************************************
 * function		script_code_block_create
 *		创建代码块
 *
 * ******************************************************/
script_code_block_t *script_code_block_create(struct script_t *script);

/********************************************************
 *	function	script_code_block_destroy
 *		销毁代码块
 *
 * ******************************************************/
void script_code_block_destroy(script_code_block_t *block);

/********************************************************
 *	function	script_exec_block_create
 *		创建执行块
 *
 * ******************************************************/
script_exec_block_t *script_exec_block_create(script_code_block_t *c_block);

/********************************************************
 *	function	script_exec_block_destroy
 *		销毁执行块
 *
 * ******************************************************/
void script_exec_block_destroy(script_exec_block_t *block);

#endif
